package com.dd.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Component  //定义为组件，交由spring管理
@Aspect  //设置当前类为AOP切面类
public class MyAdvice {

    private static final Logger logger = Logger.getLogger(MyAdvice.class);

    //定义切入点
    // execution(返回值类型 包名.类名.方法名(参数列表))
    //@Pointcut("execution(void com.dd.service.Impl.BookServiceImpl.addBook(..))")
    @Pointcut("execution(* com.dd.service.Impl.*.*(..))")
    private void pt() {}


    //制作切面
    // 绑定切入点与通知关系，并指定通知添加到原始连接点的具体执行位置
//    @Before("pt()")
//    public void method() {
//        System.out.println("AOP开始时间:" + System.currentTimeMillis());
//    }

    @Before("pt()")
    public void beforeMethod(JoinPoint jp) {

        System.out.println("AOP开始时间:" + System.currentTimeMillis());

        logger.debug("当前调用的类是：" + jp.getTarget() + "--" +
                "调用的方法是："+jp.getSignature().getName()+"---");
        logger.debug("传递参数：");
        List<Object> list = Arrays.asList(jp.getArgs());
        list.stream().forEach(o -> System.out.println(o));
    }

    @After("pt()")
    public void afterMethod() {
        System.out.println("AOP结束时间:" + System.currentTimeMillis());
    }
}
